package com.itheima.controller;

import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {
    @Resource
    private DeptService deptService;
    /**
     *一、 Cotroller里的方法，需要设置；
     * 资源路径:客户端必须通过此路径才能访问到这个方法
     * 具体实现: 利用@RequestMapping的衍生注解
     * 1、只允许GET请求访问: @GetMapping("资源路径")
     * 2、只允许POST请求访问:@PostMapping("资源路径")
     * 3、只允许PUT请求访问:@PutMapping("资源路径")
     * 4、只允许DELETE请求访问：@DeleteMapping("资源路径")
     * 二、Controller里所有方法的返回值，统一使用Result方法
     * 原因:如果没有统一的返回值，就会导致 每个方法返回的结果都不一样，乱
     *     做法:所有方法返回值必须要有一个统一的规范(每个项目组有自己的规范，进公司要会看别人写的代码，别人的Controller返回什么，自己也返回什么)
     *    我们的tlias项目组要求返回统一的Result对象
     *  如果成功了：
     *        如果不需要返回结果数据:return Result.success();
     *        如果需要返回结果数据:return Result.success(要响应的数据);
     *        如果失败了:return Result.error(失败描述);
     *
     *
     *
     */



    @GetMapping
    public Result queryAll() {
        log.info("查询部门列表");
        // 调用service完成功能，得到结果数据
        List<Dept> deptsList = deptService.queryAll();
        //将结果封装成一个Result对象并返回
        return Result.success(deptsList);


    }

/**Controller里如何接收表单格式的参数:
 * 表单格式的参数是什么样的？：参数名 =值&参数名=值&...
 * 接收表单格式的参数，方式：
 *         1、给Controller增加形参，一个形参用于接收一个表单参数。参数类型  可以由框架自动转换
 *         2、给形参上增加@RequestParam("表单参数名")
 *          如果方法形参名和表单参数名一致，那么@RequestParam可以省略不写
 *
 */

@DeleteMapping
    public Result deleteByid(Integer id) {
    log.info("根据id删除部门，id: {}", id);
        // 调用service完成功能
        deptService.deleteByid(id);
        //返回结果
        return Result.success();
    }

    /**
     * Controller里如何接收JSON格式的参数:|
     * JSON格式的参数是什么样的？
     *    对象形式：{"参数名":值,"参数名"值,"参数名":值}
     *    数组形式：[值1，值2，...] 其中每个值可能是数字、字符串、boolean、也可以是JSON对象
     *    Controller里如何接收JSON格式的参数:
     *    1、只能整体接收JSON格式的参数，不能只接受其中的一部分参数
     *    2、通常是接收成javaBean对象(或者集合):给方法增加javaBean类型的形参(或者集合类型的形参)
     *    json里有什么样的参数名，javaBean里就必须有同名的属性
     *    3、为方法形参增加注解:@RequestBody
     *
     *
     *
     */
   @PostMapping
    public Result add(@RequestBody Dept dept) {
       log.info("新增部门，dept: {}", dept);
        // 调用service完成功能
        deptService.addDept(dept);
        //返回结果
        return Result.success();
    }



/**
 * Controller里如何接收路径参数:
 *      路径参数是什么样的？在请求路径里携带的参数值，比如：GET /depts/1   这里的1就是客户端提交的参数值
 *      路径参数的位置：路径参数一般位于资源路径的某个位置
 *      如何获取路径参数的值：
 *      1、给方法增加形参，一个形参可以对应一个路径参数
 *      2、给方法这只路径标识时，需要添加表达式，用表达式对应路径参数。@GetMapping("/depts/{xxx}")
 *          其中{XX}表示一个占位符，用于匹配实际请求路径里的路径参数。
 *      3、给方法形参上增加注解@PathVariable("占位符名称")
 *      注意：如果方法形参名和路径参数名一致，那么@PathVariable可以省略不写
 *
 */
@GetMapping("/{id}")
    public Result findById(@PathVariable Integer id) {
    log.info("根据id查询部门，id: {}", id);
        // 调用service完成功能
        Dept dept= deptService.findById(id);
        //返回结果
        return Result.success(dept);
    }


    @PutMapping
    public Result update(@RequestBody Dept dept) {
        log.info("修改部门，dept: {}", dept);
        // 调用service完成功能
        deptService.updateByid(dept);
        //返回结果
        return Result.success();
    }

}